package 剑指Offer;

public class Offer47_礼物的最大价值 {


    public int maxValue(int[][] grid) {
        int row = grid.length;
        int clo = grid[0].length;

        // dp[i][j]代表从棋盘的左上角开始，到达单元格 (i,j)下标从0开始！！ 时能拿到礼物的最大累计价值。
        int[][] dp = new int[row][clo];

        //base case
        dp[0][0] = grid[0][0];
        for (int i = 1; i < clo; i++) {//初始化行是列在动，所以结尾条件是列长度
            //初始化第一行！只能从左边拿
            dp[0][i] = grid[0][i] + dp[0][i - 1];
        }
        for (int i = 1; i < row; i++) {
            //初始化第一列！只能从上边拿
            dp[i][0] = grid[i][0] + dp[i - 1][0];
        }

        //第一行、第一列已经初始化完了，直接从下标[1,1]开始
        for (int i = 1; i < row; i++) {
            for (int j = 1; j < clo; j++) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }

        return dp[row - 1][clo - 1];
    }
}
